﻿using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using drinking.Managers;
using drinking.Models;

namespace drinking.Api
{
    /// <summary>
    /// 权限过滤器
    /// </summary>
    public class ActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            try
            {
                // 先判断接口地址
                string path = context.HttpContext.Request.Path;

                
                if (path.StartsWith("/api/wx/"))
                {
                    // 微信小程序的接口，除了 登录接口和支付结果通知 都要进行权限判断
                    if (!path.StartsWith("/api/wx/login") && !path.StartsWith("api/wx/order/payCallBack"))
                    {
                        // 微信前端 每次发起http请求都要将 token 设置到请求头中，通过token在CacheCustomers 找到对应的用户对象
                        string token = context.HttpContext.Request.Headers["token"];

                        
                        if (!string.IsNullOrEmpty(token) && UserManager.CacheCustomers.TryGetValue(token, out Customer customer))
                        {
                            // 更新最后访问时间
                            UserManager.CacheCustomers[token].LastAccessTime = DateTime.Now;
                            //将从缓存中取出来的用户对象 设置到线程对象中，在整个http请求中需要用到用户对象中的数据，可以直接取出
                            UserManager.CurrCustomer.Value = customer;
                        }
                        else
                        {
                            // 如果token 不存在， 或者 CacheCustomers中不存在键值为token 的对象， 那么证明权限未登录

                            //调试期间， 下面的代码注释掉
                            context.Result = new JsonResult(Api.ApiResult.Fail(ResultCode.NO_LOGON, "未登录"));
                        }
                    }
                }
                else if (path.StartsWith("/api/admin/"))
                {
                    // 网页端的接口，权限设置跟小程序类似

                }
                else if (path.StartsWith("/api/equip/"))
                {
                    // 上位机的状态需要长时间在线， 所以不能定时清除
                }
            }
            catch(Exception ex)
            {
                context.Result = new JsonResult(Api.ApiResult.Fail(ResultCode.ERROR, $"未知错误：{ex.Message}"));
            }
            


        }


    }

    /// <summary>
    /// 全局异常处理
    /// </summary>
    public class ExceptionFilter : Microsoft.AspNetCore.Mvc.Filters.IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // 如果异常是自定义异常，取出编码
            if( context.Exception is Helpers.Exception_ )
            {
                Helpers.Exception_? e = context.Exception as Helpers.Exception_;
                context.Result = new JsonResult(Api.ApiResult.Fail(e.Code, context.Exception.Message));
            }
            else
            {
                context.Result = new JsonResult(Api.ApiResult.Fail(ResultCode.ERROR, context.Exception.Message));
            }

            
        }
    }

}
